package main

import (
	"fmt"
)

//在不声明 cap 的情况下，默认 cap=len 。当切片长度没有超过容量时，对切片新增数据，不会改变 array 指针的值。
func main() {
	var slice0 []int = make([]int, 1, 2)
	fmt.Println(slice0, len(slice0), cap(slice0))
	fmt.Printf("%p\n", &slice0)
	slice0[0] = 1
	fmt.Println(slice0, len(slice0), cap(slice0))
	slice0 = append(slice0, 2)
	slice0 = append(slice0, 3)
	slice0 = append(slice0, 4)
	fmt.Printf("%p\n", &slice0)
	fmt.Println(slice0)
	var array0 = [5]int{1, 2, 3, 4, 5}
	var slice1 = array0[1:]
	//当切片超出cap容量时,就会重新分配内存空间 与原数组无关
	fmt.Printf("%p\n", &slice1)
	slice1 = append(slice1, 4, 1, 2, 3, 4, 5, 6, 7, 8, 9, 4, 5, 2, 1, 3, 5, 6, 4, 2, 13, 1, 58, 2)
	slice1 = append(slice1, 4)
	slice1 = append(slice1, 4)
	slice1 = append(slice1, 4)
	slice1 = append(slice1, 4)
	fmt.Printf("%p %p\n", &slice1, &array0)
	fmt.Println(slice1, len(slice1), cap(slice1))

	//copy函数用于两个切片之间的copy  复制长度以 len 小的为准。两个 slice 可指向同一底层数组
	var slice2 = make([]int, 10, 15)
	copy(slice2, slice1)
	fmt.Println(slice2, len(slice2), cap(slice2))
	fmt.Printf("%p %p\n", &slice2, &slice1)

	//string 底层为byte的数组 可以进行切片操作
	var str string = "fdasfas"
	s := []byte(str)
	var slice3 = s[:]
	fmt.Println(slice3)

	//改变string
	sl := append(slice3, []byte(" hello go")...)
	fmt.Printf("%s\n", sl)

	//reslice 即改变切片的长度 但长度不能超过cap
	var slice = make([]int, 1, 3)
	fmt.Println(len(slice), cap(slice))
	slice = slice[0 : len(slice)+1]
	fmt.Println(len(slice), cap(slice))

	slice4 := []int{1, 2, 3, 4, 5}
	fmt.Println(len(slice4), cap(slice4))

	slice5 := array0[1:2:3]
	fmt.Println(slice5, len(slice5), cap(slice5))
}
